package strategy

// Strategy 策略，定义算法接口
type Strategy interface {
	// AlgorithmInterface 某个算法的接口，可以有传入参数，也可以有返回值
	AlgorithmInterface(input string) string
}

// ConcreteStrategyA 实现具体的算法
type ConcreteStrategyA struct {
}

func (a *ConcreteStrategyA) AlgorithmInterface(input string) string {
	return input + "Strategy A"
}

// ConcreteStrategyB 实现具体的算法
type ConcreteStrategyB struct {
}

func (b *ConcreteStrategyB) AlgorithmInterface(input string) string {
	return input + "Strategy B"
}

// ConcreteStrategyC 实现具体的算法
type ConcreteStrategyC struct {
}

func (c *ConcreteStrategyC) AlgorithmInterface(input string) string {
	return input + "Strategy C"
}

// Context 上下文对象，通常会持有一个具体的策略对象
type Context struct {
	// 持有一个具体的策略对象
	strategy Strategy
}

// NewContext 构造方法，传入一个具体的策略对象
func NewContext(strategy Strategy) *Context {
	return &Context{
		strategy: strategy,
	}
}

// ContextInterface 上下文对客户端体统的操作接口，可以有参数和返回值
func (c *Context) contextInterface(input string) string {
	return c.strategy.AlgorithmInterface(input)
}
